#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"
#include "dataclass.h"
#include <QFileDialog>
#include <QDebug>
#include <QInputDialog>


DataClass *dataC = new DataClass;
QVector<double> xx(7882), ymax(7882), ymin(7882);
float minX=0,maxX,minY=0,maxY=4096;


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QCustomPlot *customPlot = ui->widget;//customPlot指针指向控件

    connect(ui->actionWaveform, &QAction::triggered, this, &MainWindow::waveForm);
    connect(ui->actionHome, &QAction::triggered, this, &MainWindow::homeWaveForm);

    customPlot->setParent(this);
    customPlot->addGraph();
    customPlot->graph(0)->setPen(QPen(Qt::blue));
    customPlot->xAxis2->setVisible(true);
    customPlot->xAxis2->setTickLabels(false);
    customPlot->yAxis2->setVisible(true);
    customPlot->yAxis2->setTickLabels(false);

    /*通过下面这句语句，可以屏蔽掉QCustomPlot的鼠标消息*/
    customPlot->setAttribute(Qt::WA_TransparentForMouseEvents, true);

}

void MainWindow::homeWaveForm(){
    maxX = dataC->index;
    //dataC->findMaxMinData(0, dataC->index);
    dataC->findMaxMinData(0, maxX);
    qDebug()<<"find max/min/ind over";

    for (int i=0; i<7882; ++i){
        xx[i] = dataC->indData[i];
        ymax[i] = dataC->maxData[i];
        ymin[i] = dataC->minData[i];
    }

    ui->widget->graph(0)->setData(xx, ymax);
    ui->widget->graph(0)->rescaleAxes();
    ui->widget->yAxis->setRange(0, 4096);
    ui->widget->replot();
}

void MainWindow::waveForm(){
    QString str = QFileDialog::getOpenFileName(this,"打开文件", "C:/Users/62320/Desktop", "(*.txt)");
    QString text;
    qDebug()<<str;
    bool isOK;
    while(1){
        text = QInputDialog::getText(this, "通道选择",
                                             "请以16进制方式输入所选择的通道。\n比如：选择通道10则输入A或a",
                                             QLineEdit::Normal,
                                             "0",&isOK);
        if(isOK){
            if(QMessageBox::Yes == QMessageBox::information(this, "选择结果",
                                           "您刚才的输入是: <b>" + text + "</b>",
                                           QMessageBox::Yes | QMessageBox::No,
                                        QMessageBox::Yes)){
                break;
            }
        }
    }
    dataC->txt2dataV(str.toUtf8().data(),text.toUtf8().data());
    qDebug()<<"txt to dataVector over";
    homeWaveForm();
    QLabel * label = new QLabel("当前通道："+text+"      文件路径："+str,this);
    ui->statusBar->addWidget(label);
}

void MainWindow::resetRange(){

    if(begin_x_val<end_x_val){
        minX = begin_x_val;
        maxX = end_x_val;
    }else{
        minX = end_x_val;
        maxX = begin_x_val;
    }
    if(begin_y_val<end_y_val){
        minY = begin_y_val;
        maxY = end_y_val;
    }else{
        minY = end_y_val;
        maxY = begin_y_val;
    }

    dataC->findMaxMinData(minX,maxX);

    for (int i=0; i<7882; ++i){
        xx[i] = dataC->indData[i];
        ymax[i] = dataC->maxData[i];
        ymin[i] = dataC->minData[i];
    }

    ui->widget->graph(0)->setData(xx, ymax);

    ui->widget->xAxis->setRange(minX, maxX);
    ui->widget->yAxis->setRange(minY, maxY);
    ui->widget->replot();
}

void MainWindow::resetPos(){
    //···
    float changeX,changeY;
    changeX = end_x_val-begin_x_val;
    changeY = end_y_val-begin_y_val;

    minX -= changeX;
    maxX -= changeX;

    minY -= changeY;
    maxY -= changeY;


    dataC->findMaxMinData(minX,maxX);

    for (int i=0; i<7882; ++i){
        xx[i] = dataC->indData[i];
        ymax[i] = dataC->maxData[i];
        ymin[i] = dataC->minData[i];
    }

    ui->widget->graph(0)->setData(xx, ymax);

    ui->widget->xAxis->setRange(minX, maxX);
    ui->widget->yAxis->setRange(minY, maxY);
    ui->widget->replot();
}

void MainWindow::mousePressEvent(QMouseEvent *event){
    int x_pos = event->pos().x();
    int y_pos = event->pos().y();

    // 把鼠标坐标点 转换为 QCustomPlot 内部坐标值 （pixelToCoord 函数）
    // coordToPixel 函数与之相反 是把内部坐标值 转换为外部坐标点
    begin_x_val = ui->widget->xAxis->pixelToCoord(x_pos);
    begin_y_val = ui->widget->yAxis->pixelToCoord(y_pos);
    qDebug()<<"BWX="<<x_pos<<";BWY="<<y_pos<<"***BPX="<<begin_x_val<<";BPY="<<begin_y_val;

}

void MainWindow::mouseReleaseEvent(QMouseEvent *event){
    int x_pos = event->pos().x();
    int y_pos = event->pos().y();

    // 把鼠标坐标点 转换为 QCustomPlot 内部坐标值 （pixelToCoord 函数）
    // coordToPixel 函数与之相反 是把内部坐标值 转换为外部坐标点
    end_x_val = ui->widget->xAxis->pixelToCoord(x_pos);
    end_y_val = ui->widget->yAxis->pixelToCoord(y_pos);
    qDebug()<<"EWX="<<x_pos<<";EWY="<<y_pos<<"***EPX="<<end_x_val<<";EPY="<<end_y_val;

    if(event->button() == Qt::RightButton){
        resetRange();
    }else if (event->button() == Qt::LeftButton) {
        resetPos();
    }
}

MainWindow::~MainWindow(){
    delete ui;
}



//目前出现的问题：当点击Qcustomplot下面的区域的时候，也会重新框选。
//拟采用的解决方案：将配置文件采用非模态对话框的方式弹出，然后进行配置

//目前出现的问题：当使用右键时，依旧会框选，并出现bug。
//现在的解决方案：当使用右键时，是框选功能
//当使用左键时，是拖动波形功能

//目前要求的功能：鼠标可以拖动波形
//拟采用的解决方案：鼠标左键可以上下左右拖动？？？？
//这里需要注意一个问题，如果是上下拖动，只需要更改range即可
//但是如果是左右拖动，需要重新选点！！！
//如果是可以同时上下左右拖动呢？？？？
